#include "BloqueDisco.h"

BloqueDisco::BloqueDisco(TipoMemoria tipoMemoria, int tamanio, FILE *fp, int id){
	this->tipoMemoria = tipoMemoria;
	this->tamanio = tamanio;
	this->fp = fp;
	this->offset = ftell(fp);
	this->id = id;
}

void BloqueDisco::addComponente(ComponenteAlmacenamiento *componente){
	if(componente->getTipoMemoria()!=this->tipoMemoria)
		throw new CompuestoException(CompuestoException::add);		
	if(this->getTamanioLibre() < componente->getTamanio())
		throw new CompuestoException(CompuestoException::add);		
	Compuesto::addComponente(componente);
}

void BloqueDisco::getAccesoDato(void** accesoDato){
	fseek(this->fp,this->offset,SEEK_SET);
	*accesoDato = (void*) this->fp; 
}

void BloqueDisco::leer(char **datoLeido, TipoSerializacion modo){	
	if(this->fp==NULL)
		throw new NullPointerException();
	fseek(this->fp,this->offset,SEEK_SET);
	unsigned int bytesLeidos;
	*datoLeido = (char*) malloc(this->tamanio);
	bytesLeidos = fread(*datoLeido, this->tamanio, 1, fp);	
	if(!bytesLeidos)
		throw new DiscStorageException(StorageException::lectura);
}

void BloqueDisco::escribir(void *accesoDato, TipoSerializacion modo){
	if(this->fp==NULL||accesoDato==NULL)
		throw new NullPointerException();
	FILE *aux = (FILE*) accesoDato;
	this->offset = ftell(aux);
	this->escribo();
}

void BloqueDisco::escribir(TipoSerializacion modo){
	this->escribo();
	fseek(this->fp,this->offset,SEEK_SET);
	int i;
	for(i=0; i<this->getCantidadComponentes(); i++){
		this->getComponenteAt(i)->escribir(modo);
	}
}

void BloqueDisco::escribir(void *accesoDato, Dato *dato, TipoSerializacion modo){	
}

void BloqueDisco::borrar(){	
}

void BloqueDisco::escribo(){
	char *bloque;
	bloque = (char*) malloc(this->tamanio);
	memset(bloque,255,this->tamanio);	// inicializo bloque en FFFFFF...
	fseek(this->fp,this->offset,SEEK_SET);
	fwrite(bloque,this->tamanio,1,fp);
	free(bloque);	
}

BloqueDisco::~BloqueDisco(){
}
